#!/bin/bash
set -uo pipefail


################################################
# Initialize script environment

# Find the directory this script is stored in. (from: http://stackoverflow.com/questions/59895)
function get_source_dir() {
	local source="${BASH_SOURCE[0]}"
	while [[ -h $source ]]
	do
		local tmp
		tmp="$(cd -P "$(dirname "${source}")" && pwd)"
		source="$(readlink "${source}")"
		[[ $source != /* ]] && source="${tmp}/${source}"
	done

	echo -n "$(realpath "$(dirname "${source}")")"
}

ACTUAL_WORKING_DIRECTORY="$(realpath "$(pwd)")" || exit 1
export ACTUAL_WORKING_DIRECTORY
GENTOO_INSTALL_REPO_DIR_ORIGINAL="$(get_source_dir)"
export GENTOO_INSTALL_REPO_DIR_ORIGINAL
export GENTOO_INSTALL_REPO_DIR="$GENTOO_INSTALL_REPO_DIR_ORIGINAL"
export GENTOO_INSTALL_REPO_SCRIPT_ACTIVE=true
export GENTOO_INSTALL_REPO_SCRIPT_PID=$$

umask 0077

# shellcheck source=./scripts/utils.sh
source "$GENTOO_INSTALL_REPO_DIR/scripts/utils.sh"
# shellcheck source=./scripts/config.sh
source "$GENTOO_INSTALL_REPO_DIR/scripts/config.sh"
# shellcheck source=./scripts/functions.sh
source "$GENTOO_INSTALL_REPO_DIR/scripts/functions.sh"
# shellcheck source=./scripts/main.sh
source "$GENTOO_INSTALL_REPO_DIR/scripts/main.sh"


################################################
# Main dispatch

# Instantly kill when pressing ctrl-c
trap 'kill "$GENTOO_INSTALL_REPO_SCRIPT_PID"' INT

ACTION=""
CONFIG="$GENTOO_INSTALL_REPO_DIR/gentoo.conf"

while [[ $# -gt 0 ]]; do
	case "$1" in
		""|"help"|"--help"|"-help"|"-h")
			echo "Usage: $0 [opts]... <action>"
			echo "Performs a minimal gentoo installation. See https://github.com/oddlama/gentoo-install"
			echo "for more information. If the configuration file does not exist, the configurator will"
			echo "be started instead."
			echo ""
			echo "Options:"
			echo "  -c, --config <CONFIG>         Use the given configuration file instead of the default"
			echo "                                  location (gentoo.conf). Applies to installation as well"
			echo "                                  as initial configuration in case it doesn't exist."
			echo ""
			echo "Actions:"
			echo "  -i, --install                 Installs gentoo as configured. This is the default mode,"
			echo "                                  if the given configuration file exists."
			echo "  -R, --chroot <DIR> [CMD...]   Chroot into an existing system. The root filesystem"
			echo "                                  must already be mounted under DIR. All required special"
			echo "                                  filesystems will be mounted inside, and unmounted when"
			echo "                                  the chroot exits."
			exit 0
			;;
		"-c"|"--config")
			[[ -f "$2" ]] \
				|| die "Config file not found: '$2'"
			CONFIG="$(cd "$ACTUAL_WORKING_DIRECTORY" && realpath --relative-to="$GENTOO_INSTALL_REPO_DIR" "$2" 2>/dev/null)" || die "Could not determine realpath to config"
			shift
			;;
		"-R"|"--chroot")
			[[ -z $ACTION ]] || die "Multiple actions given"
			ACTION="chroot"
			CHROOT_DIR="$2"
			[[ -e "$CHROOT_DIR" ]] || die "Chroot directory not found: '$CHROOT_DIR'"
			shift
			;;
		"-i"|"--install")
			[[ -z $ACTION ]] || die "Multiple actions given"
			ACTION="install"
			;;
		"__install_gentoo_in_chroot")
			ACTION="__install_gentoo_in_chroot"
			;;
		*) die "Invalid option '$1'" ;;
	esac
	shift
done

# Check configuration location
[[ -z "${CONFIG%%$GENTOO_INSTALL_REPO_DIR*}" ]] \
	|| die "Configuration file must be inside the installation directory. This is needed so it is accessible from within the chroot environment."

if [[ -z "$ACTION" ]]; then
	if [[ -e "$CONFIG" ]]; then
		# Default if configuration exists: Run installer
		ACTION="install"
	else
		# Default if configuration does not exists: Run configurator, and exit afterwards.
		exec "$GENTOO_INSTALL_REPO_DIR/configure" "$CONFIG"
	fi
fi

if [[ "$ACTION" != "chroot" ]]; then
	# Load config if we aren't just chrooting
	[[ -e "$CONFIG" ]] \
		 || die "Configuration file '$CONFIG' does not exist. To run the configurator, omit '-i' flag or run ./configure"

	# shellcheck disable=SC1090
	source "$CONFIG" || die "Could not source config"
	[[ $I_HAVE_READ_AND_EDITED_THE_CONFIG_PROPERLY == "true" ]] \
		|| die "You have not properly read the config. Edit the config file and set I_HAVE_READ_AND_EDITED_THE_CONFIG_PROPERLY=true to continue."

	preprocess_config
fi

[[ $EUID == 0 ]] \
	|| die "Must be root"

mkdir_or_die 0755 "$TMP_DIR"

case "$ACTION" in
	"chroot")  main_chroot "$CHROOT_DIR" "$@" ;;
	"install") main_install "$@" ;;
	"__install_gentoo_in_chroot") main_install_gentoo_in_chroot "$@" ;;
	*) die "Invalid action '$ACTION'" ;;
esac
